Imports System.Data.SqlClient
''' <nombre>
''' Persona
''' </nombre>
Public Class cls_persona_

    Implements ICloneable

#Region "Variables ..."
    Private int_idpersona As Integer = 0
    Private int_iddenominacion As Integer = 0
    Private str_nombrefantasia As String = ""
    Private dte_fechanacimiento As DateTime = New System.DateTime(Now.Year, 1, 1)
    Private dbl_valorhora As Double = 0
    Private int_idtercero As Integer = 0

    Private obj_tercero As cls_tercero_ = Nothing
    Private obj_denominacion As cls_denominacion_ = Nothing
    Private obj_categoria As cls_categoria_ = Nothing
    Private obj_subcategoria As cls_subcategoria_ = Nothing

    Private col_Items As Collections.Generic.List(Of cls_persona_) = Nothing
#End Region

    Public Overrides Function ToString() As String
        Return tercero.apellido & ", " & tercero.nombres
    End Function

#Region "Propiedades ..."
    ReadOnly Property This
        Get
            Return Me
        End Get
    End Property
    ReadOnly Property ThisDescripcion As String
        Get
            Return Me.ToString
        End Get
    End Property
    ReadOnly Property pKey
        Get
            Return idpersona
        End Get
    End Property
    ''' <id>
    ''' True
    ''' </id>
    Property idpersona() As Integer
        Get
            idpersona = int_idpersona
        End Get
        Set(ByVal value As Integer)
            int_idpersona = value
        End Set
    End Property
    ''' <nombre>
    ''' Identificador
    ''' </nombre>
    Property iddenominacion() As Integer
        Get
            iddenominacion = int_iddenominacion
        End Get
        Set(ByVal value As Integer)
            int_iddenominacion = value
        End Set
    End Property
    ''' <nombre>
    ''' Nombre de Fantasia
    ''' </nombre>
    Property nombrefantasia() As String
        Get
            nombrefantasia = str_nombrefantasia
        End Get
        Set(ByVal value As String)
            str_nombrefantasia = value
        End Set
    End Property
    ''' <nombre>
    ''' Fecha de Nacimiento
    ''' </nombre>
    Property fechanacimiento() As DateTime
        Get
            fechanacimiento = dte_fechanacimiento
        End Get
        Set(ByVal value As DateTime)
            dte_fechanacimiento = value
        End Set
    End Property
    ''' <nombre>
    ''' Valor Hora
    ''' </nombre>
    Property valorhora() As Double
        Get
            valorhora = dbl_valorhora
        End Get
        Set(ByVal value As Double)
            dbl_valorhora = value
        End Set
    End Property
    ''' <nombre>
    ''' Identificador
    ''' </nombre>
    Property idtercero() As Integer
        Get
            idtercero = int_idtercero
        End Get
        Set(ByVal value As Integer)
            int_idtercero = value
        End Set
    End Property
    ''' <importar>
    ''' True
    ''' </importar>
    Property tercero() As cls_tercero_
        Get
            If IsNothing(obj_tercero) Then
                obj_tercero = New cls_tercero_
                If Not obj_tercero.Buscar(idtercero) Then
                    obj_tercero = Nothing
                End If
            End If
            tercero = obj_tercero
        End Get
        Set(ByVal value As cls_tercero_)
            obj_tercero = value
        End Set
    End Property

    ReadOnly Property registro() As cls_registro_
        Get
            registro = Nothing
            If Not IsNothing(tercero) Then
                If Not IsNothing(tercero.registro) Then
                    registro = obj_tercero.registro
                End If
            End If
        End Get
    End Property
    ''' <importar>
    ''' True
    ''' </importar>
    Property denominacion() As cls_denominacion_
        Get
            If IsNothing(obj_denominacion) Then
                obj_denominacion = New cls_denominacion_
                If Not obj_denominacion.Buscar(iddenominacion) Then
                    obj_denominacion = Nothing
                End If
            End If
            denominacion = obj_denominacion
        End Get
        Set(ByVal value As cls_denominacion_)
            obj_denominacion = value
        End Set
    End Property


    Property Items() As Collections.Generic.List(Of cls_persona_)
        Get
            Items = col_Items
        End Get
        Set(ByVal value As Collections.Generic.List(Of cls_persona_))
            col_Items = value
        End Set
    End Property
#End Region

    Private Sub CargarColeccion(ByVal obj_Reader As SqlDataReader)
        col_Items = New Collections.Generic.List(Of cls_persona_)
        While obj_Reader.Read()
            Dim Elemento As New cls_persona_
            Elemento.int_idpersona = (obj_Reader.GetValue(obj_Reader.GetOrdinal("idpersona")))

            If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("iddenominacion"))) = False Then
                Elemento.int_iddenominacion = (obj_Reader.GetValue(obj_Reader.GetOrdinal("iddenominacion")))
            End If
            If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("nombrefantasia"))) = False Then
                Elemento.str_nombrefantasia = (obj_Reader.GetValue(obj_Reader.GetOrdinal("nombrefantasia")))
            End If
            If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("fechanacimiento"))) = False Then
                Elemento.dte_fechanacimiento = (obj_Reader.GetValue(obj_Reader.GetOrdinal("fechanacimiento")))
            End If
            If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("valorhora"))) = False Then
                Elemento.dbl_valorhora = (obj_Reader.GetValue(obj_Reader.GetOrdinal("valorhora")))
            End If
            If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("idtercero"))) = False Then
                Elemento.int_idtercero = (obj_Reader.GetValue(obj_Reader.GetOrdinal("idtercero")))
            End If
            col_Items.Add(Elemento)
        End While
    End Sub

    Private Sub CargarVariables(ByVal obj_Reader As SqlDataReader)
        obj_Reader.Read()
        int_idpersona = (obj_Reader.GetValue(obj_Reader.GetOrdinal("idpersona")))

        If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("iddenominacion"))) = False Then
            int_iddenominacion = (obj_Reader.GetValue(obj_Reader.GetOrdinal("iddenominacion")))
        End If
        If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("nombrefantasia"))) = False Then
            str_nombrefantasia = (obj_Reader.GetValue(obj_Reader.GetOrdinal("nombrefantasia")))
        End If
        If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("fechanacimiento"))) = False Then
            dte_fechanacimiento = (obj_Reader.GetValue(obj_Reader.GetOrdinal("fechanacimiento")))
        End If
        If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("valorhora"))) = False Then
            dbl_valorhora = (obj_Reader.GetValue(obj_Reader.GetOrdinal("valorhora")))
        End If
        If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("idtercero"))) = False Then
            int_idtercero = (obj_Reader.GetValue(obj_Reader.GetOrdinal("idtercero")))
        End If
    End Sub

    Public Function Nuevo(Optional ByVal ObtenerID As Boolean = False) As Boolean
        Nuevo = False
        Dim obj_Conexion As New cls_Conexion
        Try

            'Creacion de Tercero----------------------------------------------------
            tercero.tipo = cls_tercero_.enu_tipotercero.Persona
            If tercero.idtercero = 0 Then
                tercero.Nuevo()
            Else
                tercero.Modificar()
            End If
            idtercero = obj_tercero.idtercero
            '-----------------------------------------------------------------------

            obj_Conexion.Conectar()
            With obj_Conexion.obj_SqlCommand
                .CommandType = CommandType.StoredProcedure
                .Connection = obj_Conexion.obj_SqlConnection
                .CommandText = "persona__Nuevo"
                .Parameters.Add("@iddenominacion", SqlDbType.Int).Value = int_iddenominacion
                .Parameters.Add("@nombrefantasia", SqlDbType.NVarChar).Value = str_nombrefantasia
                .Parameters.Add("@fechanacimiento", SqlDbType.DateTime).Value = dte_fechanacimiento
                .Parameters.Add("@valorhora", SqlDbType.Decimal).Value = dbl_valorhora
                .Parameters.Add("@idtercero", SqlDbType.Int).Value = int_idtercero
                .ExecuteNonQuery()
            End With
            Nuevo = True
            If ObtenerID Then
                CargarUltimo()
            End If
        Catch ex As SqlClient.SqlException
            Throw New Exception("Error al Crear el registro de persona_." & Chr(13) & _
           "Por favor informe del siguiente detalle técnico:" & Chr(13) & _
           "Nro de error: " & ex.ErrorCode & "." & Chr(13) & _
           "Descripción: " & ex.Message)
        Finally
            obj_Conexion.Desconectar()
            obj_Conexion = Nothing
        End Try
    End Function

    Public Sub Modificar()
        Dim obj_Conexion As New cls_Conexion
        Try

            'Modificacion de Tercero------------------------------------------------
            obj_tercero.Modificar()
            '-----------------------------------------------------------------------

            obj_Conexion.Conectar()
            With obj_Conexion.obj_SqlCommand
                .CommandType = CommandType.StoredProcedure
                .Connection = obj_Conexion.obj_SqlConnection
                .CommandText = "persona__Modificar"
                .Parameters.Add("@idpersona", SqlDbType.Int).Value = int_idpersona
                .Parameters.Add("@iddenominacion", SqlDbType.Int).Value = int_iddenominacion
                .Parameters.Add("@nombrefantasia", SqlDbType.NVarChar).Value = str_nombrefantasia
                .Parameters.Add("@fechanacimiento", SqlDbType.DateTime).Value = dte_fechanacimiento
                .Parameters.Add("@valorhora", SqlDbType.Decimal).Value = dbl_valorhora
                .Parameters.Add("@idtercero", SqlDbType.Int).Value = int_idtercero
                .ExecuteNonQuery()
            End With
        Catch ex As SqlClient.SqlException
            Throw New Exception("Error al Modificar el registro de persona_." & Chr(13) & _
           "Por favor informe del siguiente detalle técnico:" & Chr(13) & _
           "Nro de error: " & ex.ErrorCode & "." & Chr(13) & _
           "Descripción: " & ex.Message)
        Finally
            obj_Conexion.Desconectar()
            obj_Conexion = Nothing
        End Try
    End Sub

    Public Sub Eliminar(ByVal idpersona As Integer)
        Dim obj_Conexion As New cls_Conexion
        Try
            obj_Conexion.Conectar()
            With obj_Conexion.obj_SqlCommand
                .CommandType = CommandType.StoredProcedure
                .Connection = obj_Conexion.obj_SqlConnection
                .CommandText = "persona__Eliminar"
                .Parameters.Add("@idpersona", SqlDbType.Int).Value = idpersona
                .ExecuteNonQuery()
            End With
        Catch ex As SqlClient.SqlException
            Throw New Exception("Error al Eliminar el registro de persona_." & Chr(13) & _
           "Por favor informe del siguiente detalle técnico:" & Chr(13) & _
           "Nro de error: " & ex.ErrorCode & "." & Chr(13) & _
           "Descripción: " & ex.Message)
        Finally
            obj_Conexion.Desconectar()
            obj_Conexion = Nothing
        End Try
    End Sub

    Public Function Buscar(ByVal idpersona As Integer) As Boolean
        Dim obj_Conexion As New cls_Conexion
        Dim obj_Reader As SqlDataReader
        Try
            Buscar = False
            obj_Conexion.Conectar()
            With obj_Conexion.obj_SqlCommand
                .CommandType = CommandType.StoredProcedure
                .Connection = obj_Conexion.obj_SqlConnection
                .CommandText = "persona__Buscar"
                .Parameters.Add("@idpersona", SqlDbType.Int).Value = idpersona
            End With
            obj_Reader = obj_Conexion.obj_SqlCommand.ExecuteReader
            If obj_Reader.HasRows Then
                CargarVariables(obj_Reader)
                Buscar = True
            End If
        Catch ex As SqlClient.SqlException
            Throw New Exception("Error al Buscar el registro de persona_." & Chr(13) & _
           "Por favor informe del siguiente detalle técnico:" & Chr(13) & _
           "Nro de error: " & ex.ErrorCode & "." & Chr(13) & _
           "Descripción: " & ex.Message)
        Finally
            obj_Conexion.Desconectar()
            obj_Conexion = Nothing
            obj_Reader = Nothing
        End Try
    End Function
    Public Function BuscarXidtercero(ByVal idtercero As Integer) As Boolean
        Dim obj_Conexion As New cls_Conexion
        Dim obj_Reader As SqlDataReader
        Try
            BuscarXidtercero = False
            obj_Conexion.Conectar()
            With obj_Conexion.obj_SqlCommand
                .CommandType = CommandType.StoredProcedure
                .Connection = obj_Conexion.obj_SqlConnection
                .CommandText = "persona__buscarXidtercero"
                .Parameters.Add("@idtercero", SqlDbType.Int).Value = idtercero
            End With
            obj_Reader = obj_Conexion.obj_SqlCommand.ExecuteReader
            If obj_Reader.HasRows Then
                CargarVariables(obj_Reader)
                BuscarXidtercero = True
            End If
        Catch ex As SqlClient.SqlException
            Throw New Exception("Error al buscarXidtercero el registro de persona_." & Chr(13) & _
           "Por favor informe del siguiente detalle técnico:" & Chr(13) & _
           "Nro de error: " & ex.ErrorCode & "." & Chr(13) & _
           "Descripción: " & ex.Message)
        Finally
            obj_Conexion.Desconectar()
            obj_Conexion = Nothing
            obj_Reader = Nothing
        End Try
    End Function

    Public Function CargarUltimo() As Boolean
        CargarUltimo = False
        Dim obj_Conexion As New cls_Conexion
        Dim obj_Reader As SqlDataReader
        Try
            obj_Conexion.Conectar()
            With obj_Conexion.obj_SqlCommand
                .CommandType = CommandType.StoredProcedure
                .Connection = obj_Conexion.obj_SqlConnection
                .CommandText = "persona__CargarUltimo"
            End With
            obj_Reader = obj_Conexion.obj_SqlCommand.ExecuteReader
            If obj_Reader.HasRows Then
                CargarVariables(obj_Reader)
                CargarUltimo = True
            End If
        Catch ex As SqlClient.SqlException
            Throw New Exception("Error al CargarUltimo registro de persona_." & Chr(13) & _
           "Por favor informe del siguiente detalle técnico:" & Chr(13) & _
           "Nro de error: " & ex.ErrorCode & "." & Chr(13) & _
           "Descripción: " & ex.Message)
        Finally
            obj_Conexion.Desconectar()
            obj_Conexion = Nothing
            obj_Reader = Nothing
        End Try
    End Function

    Public Function CargarTodos(ByVal FiltrarXUsuario As Boolean, Optional ByVal idregistroestado As Integer = 1) As Boolean
        Dim obj_Conexion As New cls_Conexion
        Dim obj_Reader As SqlDataReader
        Try
            CargarTodos = False
            obj_Conexion.Conectar()
            With obj_Conexion.obj_SqlCommand
                .CommandType = CommandType.StoredProcedure
                .Connection = obj_Conexion.obj_SqlConnection

                If FiltrarXUsuario And Not UsuarioLOG.esroot Then
                    .CommandText = "persona__CargarTodosXidusuario"
                    .Parameters.Add("@idusuario", SqlDbType.Int).Value = UsuarioLOG.idusuario
                Else
                    .CommandText = "persona__CargarTodos"
                End If
                .Parameters.Add("@idregistroestado", SqlDbType.Int).Value = idregistroestado
            End With
            obj_Reader = obj_Conexion.obj_SqlCommand.ExecuteReader
            If obj_Reader.HasRows Then
                CargarColeccion(obj_Reader)
                CargarTodos = True
            End If
        Catch ex As SqlClient.SqlException
            Throw New Exception("Error al CargarTodos los registros de persona_." & Chr(13) & _
           "Por favor informe del siguiente detalle técnico:" & Chr(13) & _
           "Nro de error: " & ex.ErrorCode & "." & Chr(13) & _
           "Descripción: " & ex.Message)
        Finally
            obj_Conexion.Desconectar()
            obj_Conexion = Nothing
            obj_Reader = Nothing
        End Try
    End Function

    Public Function Clone() As Object Implements System.ICloneable.Clone
        Dim obj_persona_Clon As New cls_persona_
        obj_persona_Clon.int_idpersona = Me.int_idpersona
        obj_persona_Clon.int_iddenominacion = Me.int_iddenominacion
        obj_persona_Clon.str_nombrefantasia = Me.str_nombrefantasia
        obj_persona_Clon.dte_fechanacimiento = Me.dte_fechanacimiento
        obj_persona_Clon.dbl_valorhora = Me.dbl_valorhora
        obj_persona_Clon.int_idtercero = Me.int_idtercero
        obj_persona_Clon.col_Items = Me.col_Items
        Return obj_persona_Clon
    End Function

End Class
